package androids.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import androids.excepcion.DAOExcepcion;
import androids.modelo.Categoria;
import androids.modelo.DetallePedido;
import androids.modelo.Pedido;
import androids.modelo.Producto;
import androids.modelo.TipoEntrega;
import androids.modelo.Usuario;
import androids.util.ConexionBD;

public class DetallePedidoDAO extends BaseDAO {

	
	public void insertar(DetallePedido vo) throws DAOExcepcion {
		System.out.println("DetallePedidoDAO: insertar(DetallePedido vo)");
		String query = "INSERT INTO detalle_pedido(id_pedido, id_producto, id_tipo_entrega, precio, cantidad) VALUES (?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getMyPedido().getIdPedido());
			stmt.setInt(2, vo.getMyProducto().getIdProducto());
			stmt.setInt(3, vo.getMyTipoEntrega().getIdTipoEntrega());
			stmt.setDouble(4,vo.getPrecio());
			stmt.setInt(5, vo.getCantidad());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar los detalles del pedido");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public DetallePedido obtener(Integer IdDetallePedido) throws DAOExcepcion {
		System.out.println("DetallePedidoDAO: obtener(Integer DetallePedidoDAO)");
		DetallePedido vo = new DetallePedido();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id_detalle_pedido, id_pedido, id_producto, id_tipo_entrega, precio, cantidad from detalle_pedido where id_detalle_pedido=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, IdDetallePedido);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdDetallePedido(rs.getInt(1));
				Pedido ped = new Pedido();
				ped.setIdPedido(rs.getInt(2));
				vo.setMyPedido(ped);
				Producto pro = new Producto();
				pro.setIdProducto(rs.getInt(3));
				vo.setMyProducto(pro);
				TipoEntrega tent = new TipoEntrega();
				tent.setIdTipoEntrega(rs.getInt(4));
				vo.setMyTipoEntrega(tent);
				vo.setPrecio(rs.getDouble(5));
				vo.setCantidad(rs.getInt(6));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(Integer idDetallePedido) throws DAOExcepcion {
		System.out.println("DetallePedidoDAO: eliminar(Integer DetallePedidoDAO)");
		String query = "DELETE FROM detalle_pedido WHERE id_detalle_pedido=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idDetallePedido);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar los detalles del pedido");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void actualizar(DetallePedido vo) throws DAOExcepcion {
		System.out.println("DetallePedidoDAO: actualizar(DetallePedido vo)");
		String query = "update detalle_pedido set id_pedido=?, id_producto=?, id_tipo_entrega=?, precio=?, cantidad=? where id_detalle_pedido=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getMyPedido().getIdPedido());
			stmt.setInt(2, vo.getMyProducto().getIdProducto());
			stmt.setInt(3, vo.getMyTipoEntrega().getIdTipoEntrega());
			stmt.setDouble(4,vo.getPrecio());
			stmt.setInt(5, vo.getCantidad());
			stmt.setInt(6, vo.getIdDetallePedido());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudieron actualizar los detalles del pedido");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<DetallePedido> listar() throws DAOExcepcion {
		System.out.println("DetallePedidoDAO: listar()");
		Collection<DetallePedido> c = new ArrayList<DetallePedido>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select id_detalle_pedido, id_pedido, id_producto, id_tipo_entrega, precio, cantidad from detalle_pedido";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				DetallePedido vo = new DetallePedido();
				vo.setIdDetallePedido(rs.getInt("id_detalle_pedido"));
				Pedido ped = new Pedido();
				ped.setIdPedido(rs.getInt("id_pedido"));
				vo.setMyPedido(ped);
				Producto pro = new Producto();
				pro.setIdProducto(rs.getInt("id_producto"));
				vo.setMyProducto(pro);
				TipoEntrega tent = new TipoEntrega();
				tent.setIdTipoEntrega(rs.getInt("id_tipo_entrega"));
				vo.setMyTipoEntrega(tent);
				vo.setPrecio(rs.getDouble("precio"));
				vo.setCantidad(rs.getInt("cantidad"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}